home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / falcon / nt_dsp1.lzh / NT_DSP1.MSA / AUDIO / DGE.ASM next >
Encoding:
Assembly Source File  |  1991-03-05  |  15.1 KB  |  612 lines

  1.         page    132
  2.  
  3. ;******************************************************
  4. ;******************************************************
  5. ;*                                                    *
  6. ;*               DUAL 10-BAND IIR BAND-               *
  7. ;*           PASS FILTER GRAPHIC EQUALIZER            *
  8. ;*                                                    *
  9. ;******************************************************
  10. ;******************************************************
  11. ;
  12. ;**************************************************************************
  13. ; This program was originally available on the Motorola DSP bulletin board
  14. ; and is provided under a DISCLAIMER OF WARRANTY available from Motorola
  15. ; DSP Operation, 6501 William Cannon Dr. W Austin, Texas  78735-8598.
  16. ;**************************************************************************
  17. ;--------------------------------------------------------------------------
  18. ;********************************
  19. ;*  SSI and other I/O EQUATES    *
  20. ;********************************
  21.  
  22. START        EQU    $0040
  23. M_IPR        EQU    $FFFF
  24. M_BCR        EQU    $FFFE
  25. M_CRA        EQU    $FFEC
  26. M_CRB        EQU    $FFED
  27. M_PCC        EQU    $FFE1
  28. M_SR        EQU    $FFEE
  29. M_TX        EQU    $FFEF
  30. M_RX        EQU    $FFEF
  31.  
  32.                  
  33. ;********************************
  34. ;*  RESET VECTOR                * 
  35. ;********************************
  36.  
  37.         ORG    P:$0000
  38.         JMP    START
  39.  
  40.  
  41. ;********************************
  42. ;*  SSI RCV INTERRUPT VECTOR    * 
  43. ;********************************
  44.  
  45.         ORG    P:$000C
  46.         JSR    LRTEST
  47.         ORG    P:$000E
  48.         JSR    LRTEST
  49.  
  50.  
  51.  
  52. ;********************************
  53. ;*  MAIN PROGRAM                *
  54. ;********************************
  55.  
  56.         ORG    P:START
  57.  
  58. ;-------------------
  59. ;    Mask Interrupts
  60. ;-------------------
  61.         ORI    #$03,MR    
  62.  
  63. ;-----------------------
  64. ;    Initialize SSI Port        
  65. ;-----------------------
  66.         MOVEP    #$3300,X:M_BCR    ;3 wait states for ADC and MUX.
  67.         MOVEP    #$3000,X:M_IPR    ;SSI RCV INT priority level.
  68.         MOVEP    #$6000,X:M_CRA    ;Set SSI word length = 24. 
  69.                MOVEP    #$3200,X:M_CRB    ;Set SSI to synchronous,
  70.                     ;and enable RE and TE.        
  71.         MOVEP    #$01FF,X:M_PCC    ;Turn on SSI Port.
  72.  
  73. ;-----------------------------------------------
  74. ;   Move constants from P:mem to X:mem and Y:mem
  75. ;-----------------------------------------------
  76.     
  77.         MOVE    #$18D,R2    ;** Filter Coefficients.
  78.         MOVE    #$20,R3
  79.                     ;Table located at X:$20.
  80.         DO    #30,COLOOP    ;Length of table = 30.
  81.         MOVE    P:(R2)+,X0    ;Order is ... beta, alpha,
  82.         MOVE    X0,X:(R3)+    ;gamma for each band.
  83. COLOOP
  84.     
  85.         MOVE    #$1AB,R2        ;** Filter Gain Look-up.
  86.         MOVE    #$40,R3
  87.                     ;Table located at X:$40.
  88.         DO    #32,FGLOOP    ;Length of table = 32 (5 bits).
  89.         MOVE    P:(R2)+,X0    ;Minimum value is -.2, maximum
  90.         MOVE    X0,X:(R3)+    ;value is 0.999, center value is 0.
  91. FGLOOP
  92.  
  93.         MOVE    #$1CB,R2        ;** Volume Gain Look-up.
  94.         MOVE    #$60,R3
  95.                     ;Table located at X:$60.
  96.         DO    #32,VGLOOP    ;Length of table = 32 (5 bits).
  97.         MOVE    P:(R2)+,X0    ;Minimum value is 0, maximum
  98.         MOVE    X0,X:(R3)+    ;value is 0.9999.
  99. VGLOOP
  100.         
  101.         MOVE    #$1EB,R2        ;** Mux Sel Address.
  102.             MOVE    #0,R3
  103.                     ;Table located at Y:$00.
  104.         DO    #21,MSLOOP    ;Length of table = 21.
  105.         MOVE    P:(R2)+,X0    ;These are the MUX select addresses
  106.         MOVE    X0,Y:(R3)+    ;for each of the 21 slide pots.
  107. MSLOOP
  108.     
  109.     
  110. ;-------------------------
  111. ;    Set runtime variables
  112. ;-------------------------
  113.         MOVE    #$200000,X0    ;Constants used for data scaling.
  114.         MOVE    X0,X:>$1D
  115.         MOVE    #>$80,X0
  116.         MOVE    X0,X:>$1E
  117.  
  118.  
  119. ;------------------------------------
  120. ;    Clear x(n) and y(n) table arrays
  121. ;------------------------------------
  122.         CLR    A          ;Clear Y:$20 to Y:$BF.
  123.         MOVE    #$20,R2        
  124.                     ;This area is used for runtime
  125.         DO    #$A0,XYNCLR    ;tables, x(n) and y(n).
  126.         MOVE    A,Y:(R2)+    ;X:$20..$22 - x(n) left chan.
  127. XYNCLR                    ;X:$40..$42 - y(n) left chan. 31 Hz.
  128.                     ;X:$44..$46 - y(n) left chan. 62 Hz.
  129.                     ; ....
  130.                     ;X:$60..$62 - y(n) left chan. 16 kHz.
  131.                 
  132.                     ;X:$30..$32 - x(n) right chan.
  133.                       ;X:$80..$82 - y(n) right chan. 31 Hz.
  134.                     ;X:$84..$86 - y(n) right chan. 62 Hz.
  135.                     ; ....
  136.                     ;X:$A0..$A2 - y(n) right chan. 16 kHz.
  137.  
  138.  
  139. ;-------------------------------
  140. ;    Clear g(n) and SP(n) arrays
  141. ;-------------------------------
  142.         CLR    A        ;Clear X:$00 to X:$14.
  143.         MOVE    #0,R2        ;This is gain array which contains
  144.                     ;fractional gain value from look-up
  145.         DO    #21,GNCLR    ;table used to scale filtered band.
  146.         MOVE    A,X:(R2)+
  147. GNCLR
  148.         MOVE    #$80,R2        ;Clear X:$80 to X:$94.
  149.                     ;This is 8-bit value read from
  150.         DO    #21,SWNCLR    ;ADC slide pots.  This value when
  151.         MOVE    A,X:(R2)+    ;reduced to 5 bits is used as an
  152. SWNCLR                    ;index into gain lookup table at
  153.                                         ;X:$40.  The value from lookup table
  154.                     ;is a 24-bit fraction which is stored
  155.                     ;at X:$00..$X:$14.
  156.                                          
  157.  
  158. ;--------------------------------------------------
  159. ;    Setup Register Defaults for Interrupt Routines
  160. ;--------------------------------------------------
  161.  
  162.         MOVE    #$40,R4        ;** Yi(n):L-ch        
  163.         MOVE    #4,N4
  164.         MOVE    #$80,R6        ;** Yi(n):R-ch        
  165.         MOVE    #4,N6
  166.         MOVE    #$20,R5        ;** X(n):L-ch        
  167.         MOVE    #2,M5
  168.         MOVE    #$30,R7        ;** X(n):R-ch        
  169.         MOVE    #2,M7
  170.                  
  171.         MOVE    #$20,R0        ;** IIR Coeff
  172.         MOVE    #29,M0
  173.         MOVE    #0,R3        ;** Gain Coeff
  174.         MOVE    #20,M3
  175.             MOVE    #$80,N3
  176.  
  177.        
  178. ;-----------------------
  179. ;    Init SSI Interrupt        
  180. ;-----------------------
  181.                MOVEP    #$B200,X:M_CRB    ;Enable SSI (RIE) interrupt.
  182.         ANDI    #$FC,MR        ;Unmask all interrupts.
  183.         
  184.  
  185. ;-----------------------------------
  186. ;    Main Loop to Monitor Slide Pots
  187. ;-----------------------------------
  188.  
  189. LOOP1        MOVE    #$40,R2         ;R2 points to gain lookup table.
  190.  
  191.         DO    #21,BPCHAN    ;Scan all 21 pots.
  192.           MOVE    Y:(R3),Y1    ;MUX select address of pot.
  193.  
  194.         MOVE    Y1,Y:$8000    ;Select MUX channel.
  195.         DO    #200,ADC_RD1    ;Wait for analog MUX to stabilize.
  196.         NOP
  197. ADC_RD1
  198.         
  199.         MOVE    Y:$1000,B    ;WR strobe to ADC (starts data
  200.         NOP            ;conversion).
  201.         NOP            ;Note: A15 tied to WR of ADC.
  202.         MOVE    Y:$8000,B
  203.         DO    #500,ADC_RD2    ;Wait for conversion ADC conversion.
  204.         NOP
  205. ADC_RD2
  206.     
  207.         CLR    B
  208.         MOVE    Y:$8000,B    ;Read slide pot data from ADC.
  209.  
  210.         MOVE    #>$FF,X1    ;Mask off upper 16 bits.
  211.         AND    X1,B
  212.         MOVE    B1,X1        ;X1 now contains 8-bit pot value.
  213.             
  214.         MOVE    X:(R3+N3),Y1    ;Previous pot value.
  215.         SUB    Y1,B
  216.         ABS    B        ;If absolute value of difference
  217.         MOVE    #>9,Y1        ;is less than 9, then skip.
  218.  
  219.         CMP    Y1,B        ;Note: 9 is rather arbitrary.
  220.         JMI    SKIP
  221.  
  222.         MOVE    X1,X:(R3+N3)    ;If greater than 9, than update
  223. SKIP        MOVE    (R3)+        ;X:($80+pot_index).
  224. BPCHAN                    ;This comparsion eliminates jitter
  225.                NOP            ;about a point.
  226.                     ;End of 21 pot scan.
  227.  
  228.  
  229.         DO    #20,BPCHAN2    ;For all pots except volume control.
  230.  
  231.         MOVE    X:(R3+N3),X1    ;Load X1 with slide pot value.
  232.         MOVE    X1,B
  233.  
  234.               ASR    B        ;Reduce to 5-bit value for gain
  235.         ASR    B        ;table lookup.
  236.         ASR    B
  237.  
  238.         MOVE    B1,N2
  239.         NOP
  240.         MOVE    X:(R2+N2),X1    ;Load X1 with fractional value 
  241.                            ;from table lookup.
  242.         MOVE    X:(R3),B    ;Compare gain fraction to previous
  243.         CMP    X1,B        ;value in X:(R3).
  244.         JEQ    NOCHNG        ;Skip if no change.
  245.         JGT    NSLOPE        ;If new value is greater than
  246.                     ;previous value, go to negative
  247.                     ;slope routine.
  248.  
  249. PSLOPE        MOVE    #0.0001,Y1    ;Positive slope routine.
  250. PRAMP          ADD    Y1,B        ;Increment previous gain value
  251.         MOVE    B,X:(R3)    ;by 0.0001 towards latest value
  252.                     ;read from slide pot.
  253.         CMP    X1,B        ;Continue updating this value
  254.         JLT    PRAMP        ;until previous value exceeds
  255.                     ;new value.
  256.               JMP    NOCHNG        ;Exit positive slope routine.
  257.                     ;Note: In the course of this loop,
  258.                     ;the SSI interrupt will occur many
  259.                     ;times, so that the band-pass
  260.                     ;filter response gain will be ramped
  261.                     ;smoothly to its new value.  Thus,
  262.                     ;clicking noises generated from a
  263.                     ;coarse 5-bit gain table will be
  264.                                         ;eliminated.
  265.  
  266. NSLOPE        MOVE    #-0.0001,Y1    ;Negative slope routine.
  267. NRAMP        ADD    Y1,B        ;Same as above but negative ramp
  268.         MOVE    B,X:(R3)    ;to new gain value.
  269.         CMP    X1,B
  270.         JGT    NRAMP
  271.  
  272. NOCHNG        MOVE    X1,X:(R3)    ;Update gain table with latest value
  273.            MOVE    (R3)+        ;read from slide pot.
  274. BPCHAN2
  275.                     ;Continue for the all 20 of the
  276.                     ;band-pass slide pots.
  277.  
  278. VOLUME        MOVE    #$60,R2        ;Pot 21 (volume) is treated
  279.           MOVE    X:$94,B         ;seperately since it uses a different
  280.         ASR    B        ;gain lookup table.
  281.         ASR    B        ;Reduce 8-bit value from ADC volume
  282.         ASR    B        ;slide pot to 5-bits.
  283.  
  284.         MOVE    B1,N2        ;Use this value for index into
  285.         NOP            ;lookup table.
  286.         MOVE    X:(R2+N2),X1    ;X1 now contains volume gain
  287.                                     ;fraction.
  288.         MOVE    Y:$1E,B        ;Y:$1E is previous value of volume
  289.         CMP    X1,B        ;gain.
  290.         JEQ    NOCHNG2        ;If it has not changed, jump.
  291.         JGT    NSLOPE2        ;If it is different, decide whether
  292.                     ;to ramp negative or positive.
  293. PSLOPE2        MOVE    #0.00005,Y1    ;Positive slope routine for volume.
  294. PRAMP2         ADD    Y1,B        ;Increment previous value by 0.00005
  295.         MOVE    B,Y:$1E        ;towards new value until it has
  296.         CMP    X1,B        ;passed new value.  Then exit loop.
  297.         JLT    PRAMP2        ;Note: As before, this loop will be
  298.                     ;interrupted many times by the SSI
  299.                     ;receive flag full.  The volume gain
  300.                     ;stored at Y:$1E will ramp smoothly
  301.                     ;towards its new value.
  302.               JMP    NOCHNG2
  303.  
  304. NSLOPE2        MOVE    #-0.00005,Y1    ;Negative slope routine for volume.
  305. NRAMP2        ADD    Y1,B        ;Same as before, but ramps in the 
  306.         MOVE    B,Y:$1E        ;opposite direction.
  307.         CMP    X1,B
  308.         JGT    NRAMP2
  309.  
  310.         
  311. NOCHNG2        MOVE    X1,Y:$1E    ;Update volume gain value with
  312.         MOVE    (R3)+        ;newest value read from slide pot.
  313.  
  314.         JMP    LOOP1           ;Do everything all over again...
  315.                     ;continuing slide pot scan loop.
  316.  
  317.  
  318. ;********************************
  319. ;   MAIN INTERRUPT ROUTINE      *
  320. ;********************************
  321.  
  322. LRTEST        JSET    #0,X:M_SR,RIGHT    ;Check SC0 (LRCLK from CDP) to
  323.                     ;determine which channel to process.
  324.                          
  325. ;********************************
  326. ;   LEFT CHANNEL SERVICE        *
  327. ;********************************
  328.  
  329. ;Save registers
  330.  
  331. LEFT        MOVE    B,L:$1F        ;Save register B.
  332.  
  333. ;Recieve data
  334.         MOVEP    X:M_RX,B        ;Read SSI data.
  335.  
  336.         MOVE    B,Y0        ;Copy SSI data to Y0.
  337.         MOVE    #2,M4        ;Set y(n) modulo for 3 words.
  338.         MOVE    #10,R1        ;Set R1 index to filter gain values
  339.                     ;for the left channel.
  340.  
  341.         CLR    A        X:$1E,X0    ;X:$1E = $000080
  342.         MPY    X0,Y0,B        (R4)+        ;Scale input data
  343.         MOVE    B0,Y:(R5)            ;by 2^16.
  344.         ORI    #$08,MR                ;Set scale mode to
  345.                             ;scale up (left
  346.                                                         ;shift) when data is
  347.                             ;moved from B to X0.
  348. ;----------------------
  349. ;    All 10 Filters ...
  350. ;----------------------
  351.     DO    #10,LFBAND                ;For all 10 bands of
  352.                             ;left channel.
  353.     CLR    B      X:(R0)+,X0    Y:(R4)+,Y0    ;X0=beta;Y0=y(n-2).
  354.     MAC    -X0,Y0,B  X:(R0)+,X0    Y:(R5)+,Y0    ;X0=alpha;Y0=x(n).
  355.     MAC    X0,Y0,B      Y:(R5)-,Y0            ;X0=alpha;Y0=x(n-2).
  356.     MAC    -X0,Y0,B  X:(R0)+,X0    Y:(R4)+,Y0    ;X0=gamma;Y0=y(n-1).
  357.     MACR    X0,Y0,B      X:(R1)+,Y0            ;Y0=gain for scaling.
  358.     MOVE    B,X0      B,Y:(R4)+            ;X0=filter reponse.
  359.     MAC    X0,Y0,A      (R4)+N4            ;A=scaled response.
  360. LFBAND                            ;Continue for all
  361.                             ;10 left chan bands.
  362.  
  363.         ANDI    #$F7,MR        ;Turn off scale mode.    
  364.         MOVE    #43,M4              ;Set Yi(n) modulo to wrap around to
  365.                     ;start of entire y(n) buffer.
  366. ;------------------
  367. ;    Volume Scaling
  368. ;------------------
  369.         MOVE    X:$1D,X0            ;X:$1D=$200000.
  370.         MOVE    Y:(R5)+,Y0            ;Y0=x(n).
  371.         MAC    X0,Y0,A        Y:$1E,Y0    ;scale x(n) down 
  372.         MOVE    A,X0                ;by 2^-2.  Add this
  373.                                                         ;in to the total
  374.                                                         ;filter response.
  375.         MPY    X0,Y0,B                ;Y0=volume gain.
  376.                             ;Scale total left
  377.                             ;data by volume.
  378.         ASL    B        (R4)+N4        
  379.         ASL    B                ;Scale result by
  380.                             ;2^2.
  381.         MOVE    B,X0        #>$8000,Y0    ;Now, move B to X0
  382.         MPY    X0,Y0,B                ;to force limiting.
  383.                             ;Scale result down
  384. ;----------------------------                ;by 2^-8.
  385. ;    Output Data to CD Player
  386. ;----------------------------
  387.  
  388. LXMIT        MOVEP    B,X:M_TX      ;Write result to SSI.
  389.  
  390.         MOVE    L:$1F,B        ;Retrieve B register and return.
  391.         RTI
  392.  
  393.  
  394. ;********************************
  395. ;   RIGHT CHANNEL SERVICE       *
  396. ;********************************
  397.  
  398. RIGHT        MOVE    B,L:$1F                ;Right channel process
  399.                         ;identical to Left channel,
  400.         MOVEP    X:M_RX,B        ;except right channel index
  401.         MOVE    B,Y0            ;registers (R6 and R7), and
  402.         MOVE    #2,M6            ;first 10 gain table values
  403.         MOVE    #0,R1            ;are used instead.
  404.  
  405.         CLR    A        X:$1E,X0
  406.         MPY    X0,Y0,B        (R6)+
  407.         MOVE    B0,Y:(R7)
  408.         ORI    #$08,MR
  409.  
  410. ;----------------------
  411. ;    All 10 Filters ...
  412. ;----------------------
  413.         DO    #10,RFBAND
  414.         CLR    B        X:(R0)+,X0    Y:(R6)+,Y0
  415.         MAC    -X0,Y0,B    X:(R0)+,X0    Y:(R7)+,Y0
  416.         MAC    X0,Y0,B        Y:(R7)-,Y0
  417.         MAC    -X0,Y0,B    X:(R0)+,X0    Y:(R6)+,Y0
  418.         MACR    X0,Y0,B        X:(R1)+,Y0
  419.         MOVE    B,X0        B,Y:(R6)+
  420.         MAC    X0,Y0,A        (R6)+N6
  421. RFBAND
  422.  
  423.         ANDI    #$F7,MR
  424.         MOVE    #43,M6
  425.  
  426. ;------------------
  427. ;    Volume Scaling
  428. ;------------------
  429.         MOVE    X:$1D,X0
  430.         MOVE    Y:(R7)+,Y0
  431.         MAC    X0,Y0,A        Y:$1E,Y0
  432.         MOVE    A,X0
  433.         MPY    X0,Y0,B
  434.  
  435.         ASL    B        (R6)+N6
  436.         ASL    B
  437.  
  438.         MOVE    B,X0        #>$8000,Y0
  439.         MPY    X0,Y0,B
  440.  
  441. ;----------------------------
  442. ;    Output Data to CD Player
  443. ;----------------------------
  444.  
  445. RXMIT        MOVEP    B,X:M_TX
  446.  
  447.         MOVE    L:$1F,B
  448.         RTI
  449.  
  450.  
  451. ;********************************
  452. ;* DATA VARIABLES and CONSTANTS *
  453. ;********************************
  454.  
  455.         ORG    P:$18D
  456.  
  457. ;--------------------                  
  458. ;    IIR Coefficients                  
  459. ;--------------------                  
  460.  
  461. ;  31 Hz
  462.         DC    .4984587               ;beta
  463.         DC    .0007706594        ;alpha
  464.         DC    .9984491        ;gamma
  465. ;  62 Hz
  466.         DC    .496876            
  467.         DC    .001562013
  468.         DC    .9968368
  469. ;  125 Hz
  470.         DC    .4937405
  471.         DC    .003129769
  472.         DC    .9935817
  473. ;  250 Hz
  474.         DC    .4876357
  475.         DC    .006182143
  476.         DC    .9870087
  477. ;  500 Hz
  478.         DC    .4757282
  479.         DC    .01213592
  480.         DC    .9732514
  481. ; 1000 Hz
  482.         DC    .4531951
  483.         DC    .02340247
  484.         DC    .9435273
  485. ; 2000 Hz
  486.         DC    .4128511
  487.         DC    .04357446
  488.         DC    .8760584
  489. ; 4000 Hz
  490.         DC    .3474929
  491.         DC    .07625358
  492.         DC    .7136286
  493. ; 8000 Hz
  494.         DC    .2601072
  495.         DC    .1199464
  496.         DC    .3176087
  497. ; 16000 Hz
  498.         DC    .180994
  499.         DC    .159503
  500.         DC    -.4435172
  501.  
  502.  
  503. ;--------------------------------
  504. ;    Filter Gain (G) Coefficients
  505. ;--------------------------------
  506.  
  507.         DC    -0.200
  508.         DC    -0.187
  509.         DC    -0.171
  510.         DC    -0.160
  511.         DC    -0.150
  512.         DC    -0.137
  513.         DC    -0.114
  514.         DC    -0.103
  515.  
  516.         DC    -0.092
  517.         DC    -0.080
  518.         DC    -0.067
  519.         DC    -0.051
  520.         DC    -0.039
  521.         DC    -0.027
  522.         DC    -0.015
  523.         DC      0.000
  524.  
  525.         DC       0.000
  526.         DC     0.030
  527.         DC     0.060
  528.         DC     0.090
  529.         DC     0.120
  530.         DC     0.150
  531.         DC     0.180
  532.         DC     0.210
  533.  
  534.         DC     0.250
  535.         DC     0.290
  536.         DC     0.340
  537.         DC     0.380
  538.         DC     0.460
  539.         DC     0.540
  540.         DC     0.750
  541.         DC     0.999
  542.  
  543. ;--------------------------------
  544. ;    Volume Gain (V) Coefficients
  545. ;--------------------------------
  546.  
  547.         DC     0.0000 
  548.         DC     0.0000 
  549.         DC     0.0002   
  550.         DC     0.0005 
  551.         DC     0.0010 
  552.         DC     0.0030
  553.         DC     0.0100 
  554.         DC     0.0150 
  555.  
  556.         DC     0.0200 
  557.         DC     0.0300 
  558.         DC     0.0400 
  559.         DC     0.0600 
  560.         DC     0.0800 
  561.         DC     0.1000 
  562.         DC       0.1200 
  563.         DC      0.1500 
  564.                     
  565.         DC       0.2000 
  566.         DC     0.2500 
  567.         DC     0.3000 
  568.         DC     0.3500 
  569.         DC     0.4000 
  570.         DC     0.4500 
  571.         DC     0.5000 
  572.         DC     0.6000 
  573.                     
  574.         DC     0.7000 
  575.         DC     0.8000 
  576.         DC     0.9000 
  577.         DC     0.9999 
  578.         DC     0.9999 
  579.         DC     0.9999 
  580.         DC     0.9999 
  581.         DC     0.9999 
  582.  
  583.  
  584. ;---------------------
  585. ;  Slide Pot Addresses
  586. ;---------------------
  587.         DC    $70
  588.         DC    $71
  589.         DC    $72
  590.         DC    $73
  591.         DC    $74
  592.         DC    $75
  593.         DC    $76
  594.         DC    $77
  595.         DC    $68    
  596.         DC    $69
  597.         DC    $6A
  598.         DC    $6B
  599.         DC    $6C
  600.         DC    $6D
  601.         DC    $6E
  602.         DC    $6F
  603.         DC    $58
  604.         DC    $59
  605.         DC    $5A
  606.         DC    $5B
  607.         DC    $5C
  608.  
  609.         END
  610.  
  611.  
  612.